package cn.wolfcode.luowowo.controller;

import cn.wolfcode.luowowo.domain.UserInfo;
import cn.wolfcode.luowowo.interceptor.LoginRequire;
import cn.wolfcode.luowowo.redis.srevice.IStrategyRedisSrevice;
import cn.wolfcode.luowowo.redis.srevice.IUserRedisSrevice;
import cn.wolfcode.luowowo.service.IUserInfoService;
import cn.wolfcode.luowowo.util.AssertUtil;
import cn.wolfcode.luowowo.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;


@RestController
@RequestMapping("users")
public class UserInfoController {
    @Autowired
    private IUserInfoService userInfoService;
    @Autowired
    private IUserRedisSrevice userRedisSrevice;
    @Autowired
    private IStrategyRedisSrevice strategyRedisSrevice;
    /*获取配置文件中的信息*/
    @Value("${sms.url}")
    private String smsUrl;
    @Value("${sms.appkey}")
    private String smsAppkey;
    @Value("${sms.signature}")
    private String smsSignature;
    
    @GetMapping("/get")
    public Object get(String id) {
        return userInfoService.get(id);
    }
    
    //验证手机号码的唯一性
    @GetMapping("/checkPhone")
    public Object checkPhone(String phone) {
        boolean data = userInfoService.checkPhone(phone);
        //返回是否被注册 由于后端查询的是true为有值,前台需要的判断是相反的 所以这里做取反操作
        return !data;
    }
    
    //生成验证码
    @GetMapping("/sendVerifyCode")
    public Object sendVerifyCode(String phone) {
        //将号码传到后台,生成验证码,存进缓存中 同时将四个信息一起带过去
        userInfoService.sendVerifyCode(phone, smsUrl, smsAppkey, smsSignature);
        //返回一个jsonResult里面的常量
        return JsonResult.success();
    }
    
    //判断验证码信息是否正常 接收前端传来的验证码信息与用户的注册信息
    //注册 包括用户的其他信息,进行判断,返回的异常用统一异常进行判断'
    @PostMapping("/regist")
    public Object regist(String verifyCode, String phone, String nickname, String password, String rpassword) {
        /*将值传到业务层进行判断 如果没有报错的情况下将值全部存进数据库*/
        userInfoService.setUserInfo(verifyCode, phone, nickname, password, rpassword);
        return JsonResult.success();
    }
    
    //登录接口 传过来的是两个数据 一个是用户的手机号=username 密码=password
    @PostMapping("/login")
    public Object login(String username, String password) {
        /*前端除了返回正确的信息外
         还有就是返回用户的对象信息及token令牌
          方便后面的其他请求信息判断是否已经登录*/
        //首先查询用户的user和pass是否存在后台 后面进行判断 为空就是用户没有注册 抛出异常 不为空就返回用户的对象信息及token
        UserInfo user = userInfoService.getUserByUsernameAndPassword(username, password);
        System.out.println("用户的对象信息:" + user);
        //获取用户的对象后 将数据存进redis中 创建唯一的key来存储数据
        String token = userRedisSrevice.getUserKey(user);
        /*获取了token和用户的信息后,封装进data里面,方便传输*/
        HashMap<String, Object> data = new HashMap<>();
        data.put("user", user);
        data.put("token", token);
        return JsonResult.success(data);
    }
    
    //每次请求都会进入这个接口进行判断,从请求里面获取token,作为key去查询缓存中是否存在对应的信息
    @GetMapping("/currentUser")
    @LoginRequire
    public Object currentUser(HttpServletRequest request) {
        /*从请求信息中获取key*/
        String token = request.getParameter("token");
        /*将token传到后台 如果存在对应的信息就进行重置有效期时间 没有就报错*/
        UserInfo user = userRedisSrevice.judgeUserByKey(token);
        
        return JsonResult.success();
        
    }
    
    //前端回显收藏的显示
    @LoginRequire
    @GetMapping("/strategies/favor")
    public Object strategiesFavor(String userId) {
        //返回的是用户收藏的集合
        List<String> list = strategyRedisSrevice.userCollectList(userId);
        return JsonResult.success(list);
    }
}
